最近遇到的数据处理问题,做个记录,以后可以在此基础上修改为其他文本处理程序!

Python 富文本转CSV格式

jskyzero 2023/04/16

背景概述

打算制作一个朴素的索引网页,里面是GameAIPro的大量文章,在原有信息的基础上多一些需要显示的批注字段。本来是打算直接动手的,但是写了10篇就感觉markdown表格的长行,编辑起来太难受了。

研究了一下github自带的jekyll是可以用_data/*.csv来实现数据导入的,再自己随便写点jekyll的模板就完事了。使用csv格式,我们就可以来使用类excel的表格工具管理编辑数据,不错。

问题又来到了如何将现有网站上的信息转化到csv格式,手动吗?约200篇文章,手动多少有点费事,还是写个中转工具吧,就决定是你了,Python!

控制流模型

我们要做的事情大概是这样:

继续用用面向过程的方式来描述的话,Python的控制流大概是这样子的:

面向过程的程式写的有些多了,不如这次试试面向对象的方式:

编码部分

  • 载入文件

对每一行进行单独处理:

def read(self, file_path):
        """read txt"""
        with open(file_path, "r", encoding="utf-8") as txt_file:
            for line in txt_file:
                if line.startswith("Section"):
                    self.current_section = line.split(':')[1].strip()
                    # print(self.current_section)
                elif line.startswith("-") or line == "\n":
                    pass
                else:
                    article = Article(line, self.current_section)
                    self.articles.append(article)
        return self
  • 文本类的文本处理

这里有一个有意思的工具方法,slice,将字符串进行切分,再对切分后的字符串进行一次切片操作,以此来快速将字符串中的关键信息提取出来。

    def __init__(self, line, section):
        self.section = section
        # 2\. [title](src), authur [demo code](demo_src)\
        self.index, line = self.slice(line, '.', None, -1, 1, None)
        # [title](src), authur [demo code](demo_src)\
        self.title, line = self.slice(line, ']', 1, None, 1, None)
        # (src), authur [demo code](demo_src)\
        self.src, line = self.slice(line, ')', 1, None, 2, None)
        if "demo" in line:
            # authur [demo code](demo_src)\
            self.authur, line = self.slice(line, '[', None, None, None, None)
            # [demo code](demo_src)\
            _, line = self.slice(line, '(', None, None, None, None)
            # (demo_src)\
            self.demo_src, _ = self.slice(line, ')', 1, None, None, None)
        else:
            # authur\
            self.authur = line
            self.demo_src = ""
        # authur\
        if self.authur.endswith("\\"):
            self.authur = self.authur[:-1]
        # print(str(self))

    @staticmethod
    def slice(str, chr, a=None, b=None, c=None, d=None):
        index = str.find(chr)
        left = str[0:index].strip()
        right = str[index:].strip()
        return (left[a:b].strip(), right[c:d].strip())
  • 处理导出

这部分就比较简单了,直接map一下然后写入文件就行。

    def to_csv(self):
        self.csv = map(lambda x: x.to_csv(), self.articles)
        return self

    def write(self, file_path):
        with open(file_path, 'w') as f:
            # using csv.writer method from CSV package
            write = csv.writer(f)
            write.writerow(Article.to_csv_header())
            write.writerows(self.csv)
        return self

参考

results matching ""

    No results matching ""